package com.atguigu.spzx.common.exphandler;


import com.atguigu.spzx.common.exp.GuiguException;
import com.atguigu.spzx.model.vo.common.Result;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
//唯一的异常处理器,目标接口中如果出现抛出异常 将统一执行该处理器的方法
public class GlobalExceptionHandler {
    //原则：实际抛出的异常，和哪个异常处理器方法能获取的异常的类型更接近，就执行哪个方法 （就近）
    //当目标接口中出现Exception类型的异常时，将会执行该方法
    //方法的参数，就是目标接口的异常
    @ExceptionHandler(value = Exception.class)
    public Result handlerException(Exception exception){
        exception.printStackTrace();
        //如果出现Exception类型异常，给客户端响应 {  code:299,message:xxxx ,data:null }
        return Result.build(null,299,exception.getMessage());
    }


    //该异常处理器方法，处理GuiguException类型的异常
    @ExceptionHandler(value = GuiguException.class)
    public Result handlerException(GuiguException exception){
        exception.printStackTrace();
        return Result.build(null,exception.getCode(),exception.getMessage());
    }

    //该异常处理器方法，处理NullPointerException类型的异常
    @ExceptionHandler(value = NullPointerException.class)
    public Result handlerException(NullPointerException exception){
        exception.printStackTrace();
        return Result.build(null,299,exception.getMessage());
    }

    //该异常处理器方法，处理ArithmeticException类型的异常
    @ExceptionHandler(value = ArithmeticException.class)
    public Result handlerException(ArithmeticException exception){
        exception.printStackTrace();
        return Result.build(null,299,exception.getMessage());
    }

    // A  extend ArithmeticException   ,  throw A
}
